进程监控
日常程序运行中,有很多意外情况导致程序中断,想要及时监测到程序是否正常运行则需要通过一些手段来实现, 比如在程序中添加一些监控提示,但是如果对原始程序修改不方便,则可以通过外部监控的方式进行.
本文主要介绍使用python对程序的进程进行监控,如果进程中断,则发出预警.
监控进程的方式有很多种,
-
第一种是列出当前所有的进程名,然后判断需要监控的进程在不在列出的进程名中,如果不在,则报警.
-
第二种是使用linux命令统计需要监控的进程的进程数, 如果进程数小于零,则报警,或者重启进程.
psutil
psutil可以获取进程的很多信息, 我们可以通过这个库统计进程进行相应的判断
例如, 下面代码片段是通过获取电脑中的所有进程并且和需要监控的进程进行对比.
monitor_list = {'datagrip', 'bash} # 指定需要监控的服务进程列表 while True proc_name = set() # 系统检测的进程名 for proc in psuitl.process_iter(attrs=['name]): proc_name.add(proc.info['name]) proc_stop = monitor_list - proc_name # 统计指定服务进程列表中没有启动的进程 if proc_stop: # TODO # 如果监控到进程停掉之后,可以在这边进行相关的操作,比如通过微信或者钉钉等程序发出警报信息, 同样也可以重启某个进程 time.sleep(5) #每隔5秒执行一次
下面是一个通过进程监控,监控到进程停止之后通过钉钉机器人进行监控报警
import psutil import requests import time import json monitor_name_set = {'datagrip', 'zsh'} # 创建用户指定监控的服务进程名称 # 钉钉机器人的token dingding_url = 'https://oapi.dingtalk.com/robot/send?access_token=5077e77b6059f15efe28a6611c430c16762b07c37627c7b5bc81e758a34ee835' while True: proc_dict = {} proc_name = set() # 系统检测的进程名称 for proc in psutil.process_iter(attrs=['pid', 'name']): proc_dict[proc.info['pid']] = proc.info['name'] proc_name.add(proc.info['name']) proc_stop = monitor_name_set - proc_name if proc_stop: # 如果确实有监控的进程停掉了,发出告警 for p in proc_stop: p_status = '停止' p_name = p data = { "msgtype": "markdown", "markdown": { "title": "监控信息", "text": "### %s\n" % time.strftime("%Y-%m-%d %X") + "> #### 服务名:%s \n\n" % p_name + "> #### 状态:%s \n\n" % p_status + "> #### 请尝试启动" }, } headers = {'Content-Type': 'application/json;charset=UTF-8'} send_data = json.dumps(data).encode('utf-8') requests.post(url=dingding_url, data=send_data, headers=headers) time.sleep(5)
commands
通过commands查询所需要监控的进程数,进程数小于0,则做相应的预警操作
status,output = commands.getstatusoutput("jps -m |grep 'com.static.app.Main'|wc -l") print(output) if (output == '0'): # TODO # 进程不存在,进行相应的操作
这种操作可以结合crontab,创建定时任务,如果进程不存在则重启进程
完整示例
import commands import os import sys import logging def monitor_process(): status,output = commands.getstatusoutput("jps -m |grep 'com.static.app.Main'|wc -l") if (output == '0'): # 执行指定的命令 os.system("sh /server/statics/start.sh") if __name__ == '__main__': monitor_process()
crontab命令, 每五分钟执行一次
*/5 * * * * source /etc/profile && cd /server/statics/ && python /server/statics/defend.py